# coding=utf-8
"""

    !! 本机需安装 mysql client !!
    !! 本机需安装 mysql client !!
    !! 本机需安装 mysql client !!


    ginger_test_platform_000.sql
    是一个调试用的示例, 命令在文件内
    ginger_test_platform_000.sql
    是一个调试用的示例, 命令在文件内
    ginger_test_platform_000.sql
    是一个调试用的示例, 命令在文件内


自动备份构想 :
    1. 使用 Python 的定时任务库, 创建定时任务, 每天凌晨实现备份操作 ( 已改为每周二凌晨 )
    2. windows 服务, 开机自启动, 时间到凌晨指定时间时, 执行备份操作
    -> windows 服务方式更好一些, 因为开机能自动启动, 定时任务也需要配置开机自启动 <--
    -> 最后是 windows 服务配合 Python 的 Schedule 库发布的定时任务一起实现备份 <-


思路 :
    获取所有数据库, 忽略系统数据库, ( 忽略测试用数据库 )
    遍历全部数据库, 每个数据库生成一个备份 sql 文件, 比如 jsf-ssm 数据库, 就生成 jsf-ssm.sql ( 时间戳后缀 )
    每天凌晨执行, 删除前一天的备份, 存储今天的备份, 因为这里是先删后存的, 所以最好是存储两天的会比较安全 ( 删除两天前的 )
    由于是本地运行, 所以还是搭配 windows 服务会更好一些 ...
    由于是本地运行, 且使用 mysql 命令和 mysqldump 工具, 所以需要本机安装 mysql client ...


实现 : !! 本机需安装 mysql client !!
    mysql_backup
     |_ main
     |   |_ __init__     --->  常量
     |   |_ do_utils     --->  工具包
     |   |_ do_share     --->  局域网分享
     |   |_ ding_talk    --->  钉钉机器人通知
     |   |_ do_backup    --->  数据库备份与定时任务
     |_ win_service      --->  将备份的脚本发布为 windows 服务


其他 :
    这里备份是使用 mysqldump 直接备份的, 用于备份测试环境数据库还行, 其他环境就不适用了, 能倒是能, 就是大, 慢, 可能 "污染" 缓冲池
    还有一些慢备份,
        比如备份为 csv 文件, writer.writerow([i[0] for i in cursor.description]), writer.writerows(cursor), write as csv;
        比如通过 SELECT * INTO OUTFILE '{file_name}' FROM {table_name}; ( 此种方式为备份单表, 只能写入到服务所在主机, 且需要权限 )
    还有一些备份方式,
        Xtrabackup { 全量备份 / 压缩备份 / 全流量备份 / 远程主机备份 / 增量备份 }
    emmmmmm, 学无止境 ,,,


升级 :
1.
    当前是先删除文件夹, 然后再创建文件夹, 执行备份
    这样就有一个风险, 那就是万一删除完成了, 备份却失败了
    那岂不是上一次的备份还丢失了 ... 那不白备了 ...
    所以需要对这个机制做一个升级, 比如用两个文件夹来实现
    [ backup_1, backup_2 ]
    当 backup_1 存在时, 备份到 backup_2, 备份完成, 删除 backup_1
    当 backup_2 存在时, 被分到 backup_1, 备份完成, 删除 backup_2
    这样能保证备份成功之后才执行删除操作, 避免了删除备份后又备份失败导致丢失备份的情况.
    emmm, 你看到这个注释了, 那你实现下吧, 哈哈哈 ~~
2.
    当前生成的恢复脚本, 需要自行复制粘贴, 其实可以直接生成 { cmd/powershell/shell } 脚本的, 一键恢复岂不是更方便快捷
    我是懒得弄了, 恢复频率挺低的, 手动就手动吧,
    你都看到这里了, 生成 cmd 脚本你不得给实现了呀, 年轻人要有 devops 思维和热情 ~
"""

import os

# @Time    :  2024-06-05 14:17:45
# @Author  :  jiangtong
# @Email   :  gingerqgyy@outlook.com
# @Project :  mysql_backup
# @File    :  __init__.py

# 全局常量 :
SHARE_FOLDER = r'D:\Useless\Share'
BACKUP_FOLDER = os.sep.join([SHARE_FOLDER, 'SQL', 'backups'])
IGNORE_DBS = ['Database', 'performance_schema', 'mysql', 'sys', 'information_schema', 'jsf-ssm', 'tanhedb-test', 'test', 'test-spu', ]

# 除了 gitlab 外, 如果在其他代码仓库中上传, 请先删除如下两个密码, 主要是我自己云服务器的密码, 测试环境的本地密码倒无所屌谓 ~
DB_INFO_H = {'host': '192.168.3.70', 'user': 'root', 'password': 'y123456', 'port': '3306'}
DB_INFO_OWN = {'host': '121.36.110.11', 'user': 'root', 'password': '--><--', 'port': '33060'}
